/**
*
*/
package org.javacommerce.google.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.javacommerce.google.handler.CalculationException;
import org.javacommerce.google.handler.HandlerFactory;
import org.javacommerce.google.ws.API;
import com.google.checkout.MerchantCalculationCallback;
import com.google.checkout.MerchantCalculationResults;
/**
* Google Calculation Callback Servlet. Loads the Calculation Handler specified in the configuration
* by <code>google.handler.merchantCalculationCallback</code>.
* @author Michael Blanton (mike@mikeblanton.com)
* @web.servlet name="Calculation"
* @web.servlet-mapping
* url-pattern="/Calculation"
*/
public class CalculationServlet extends HttpServlet {
private static final Log LOG = LogFactory.getLog(CalculationServlet.class);
/**
*
*/
private static final long serialVersionUID = 8959761914960576978L;
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
/**
* HTTP POST method to support Google Merchant Calculation Callbacks.
* @see <a href="http://code.google.com/apis/checkout/developer/index.html#merchant_calculations_api">http://code.google.com/apis/checkout/developer/index.html#merchant_calculations_api</a>
*/
protected void doPost(HttpServletRequest _request, HttpServletResponse _response) throws ServletException, IOException {
// Validate the Authorization header
String authorization = _request.getHeader("Authorization");
if (authorization == null || !authorization.equals(API.getAuthorizationHeader())) {
if (LOG.isErrorEnabled()) {
LOG.error("Unauthorized access attempt from [" + _request.getRemoteAddr() + "].");
}
_response.setStatus(HttpStatus.SC_UNAUTHORIZED);
return;
}
try {
// Authorization matches, grab the request
MerchantCalculationCallback callback = (MerchantCalculationCallback) Unmarshaller.unmarshal(MerchantCalculationCallback.class, _request.getReader());
MerchantCalculationResults results = HandlerFactory.getCalculationHandler().performCalculation(callback);
_response.addHeader("Content-Type", "application/xml");
_response.addHeader("Accepts", "application/xml");
results.marshal(_response.getWriter());
_response.setStatus(HttpStatus.SC_OK);
} catch (IOException e) {
if (LOG.isErrorEnabled()) {
LOG.error("IOException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (MarshalException e) {
if (LOG.isErrorEnabled()) {
LOG.error("MarshalException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (ValidationException e) {
if (LOG.isErrorEnabled()) {
LOG.error("ValidationException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (InstantiationException e) {
if (LOG.isErrorEnabled()) {
LOG.error("InstantiationException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (IllegalAccessException e) {
if (LOG.isErrorEnabled()) {
LOG.error("IllegalAccessException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (ClassNotFoundException e) {
if (LOG.isErrorEnabled()) {
LOG.error("ClassNotFoundException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} catch (CalculationException e) {
if (LOG.isErrorEnabled()) {
LOG.error("CalculationException processing Google Callback: " + e.getLocalizedMessage(), e);
}
_response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
}
}
}